home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
tiffsmt
/
tiffsmt.c
next >
Wrap
Text File
|
1993-07-08
|
11KB
|
326 lines
/*
**【 作品名 】 TIFFSMT
**【 版 数 】 V1.0 L10
**【 作 者 】 WAVE Soft
**【 日 付 】 1993.2.7
** 1993.2.21 修正
**
**【 説 明 】 ソフトウェア種別:画像処理ソフト(フィルター)
** ビデオカードからデジタイズした画像の画像処理を行います。
** 処理は、各ドットの回りにあるドットを調べて、平滑化しています。
**
** 使い方はコンソールから
**
** run386 tiffsmt.exp -l level -o outfile.tif infile
** level: 1 から 93 までの数字を指定する
** outfile: 処理した画像を保存するファイル名
** infile: デジタイズした画像のファイル
**
** (C) 1993 WAVE Soft
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <DOS.h> /* _FP_SEG(), _FP_OFF() */
#include <egb.h>
#define PROTO
#define CLEAR_CODE 256
#define EOF_CODE 257
#define MAXTABLE 4096
char gwork[EgbWorkSize];
typedef struct {
char *fname; /* 画像の名前 */
short xsize ; /* 横のドット数 */
short ysize ; /* 縦のドット数 */
short bpixel; /* ピクセルのドット数 1:2 4:16 8:256 16:32768 色を示す。 */
char comprs; /* 圧縮の状態 1:無 5:LZW */
char phintp; /* 0:モノクロ 1:カラー 3:パレット */
short imgoff; /* 画像データへのoffset */
short pltoff; /* パレットデータへのoffset 0:パレット未使用 */
long ibyte ; /* 画像データのバイト数 */
} tiff_tag;
tiff_tag t;
unsigned short awork[240][320]; /* 画像データ */
unsigned char fwork[0x200]; /* TAG データ */
int main(int argc, char *argv[])
{
const char *inpfile="";
const char *outfile="tiffsmt.tif";
int level=16,count=1;
char para[64];
int ret,i;
if(argc==1)
{printf("option: [-l level] [-c count] [-o outfile] infilename\n");
puts(" level = 0 ` 93(defaut:16)");
puts(" outfile = save するファイル名(default:tiffsmt.tif)");
puts(" infilename = 処理するファイル名 '.tif' にしてね");
puts(" 320*240 の 32K色の画像が対象です。");
return 1;
}
for(i=1; i<argc; i++)
{
if(strcmp(argv[i],"-l")==0) {i++;level=atoi(argv[i]);}
else if(strcmp(argv[i],"-c")==0) {i++;count=atoi(argv[i]);}
else if(strcmp(argv[i],"-o")==0) {i++;outfile=argv[i];}
else inpfile=argv[i];
}
if( (ret=load_tiff(inpfile,awork))== -1 )
{printf("%s がロードできんかった。\n",inpfile);return ret;}
if( ret== -2 )
{printf("このTIFF 形式 のヘッダは扱えないよ。\n");return ret;}
if( ret== -3 )
{printf("このTIFF 形式 ファイルは扱えないよ。\n");
printf("ファイル名: %s のデータ\n",t.fname);
printf("横のドット数 = %d\n",t.xsize);
printf("縦のドット数 = %d\n",t.ysize);
printf("ピクセルのドット数(1:2 4:16 8:256 16:32768) = %d\n",t.bpixel);
printf("圧縮の状態(1:無 5:LZW ) = %d\n",t.comprs);
printf("画像の種類(0:モノクロ 1:カラー 3:パレット) = %d\n",t.phintp);
return ret;}
set_screen();
DWORD(para )=(unsigned int)awork;
WORD(para+ 4)=0x14;
WORD(para+ 6)=0;
WORD(para+ 8)=0;
WORD(para+10)=t.xsize-1;
WORD(para+12)=t.ysize-1;
EGB_putBlock(gwork,0,para);
for(i=0;i<count;i++)
{ char para[64];
DWORD(para )=(unsigned int)awork;
WORD(para+ 4)=0x14;
WORD(para+ 6)=0;
WORD(para+ 8)=0;
WORD(para+10)=t.xsize-1;
WORD(para+12)=t.ysize-1;
EGB_getBlock(gwork,para);
flat(level);
}
{ char para[64];
DWORD(para )=(unsigned int)awork;
WORD(para+ 4)=0x14;
WORD(para+ 6)=0;
WORD(para+ 8)=0;
WORD(para+10)=t.xsize-1;
WORD(para+12)=t.ysize-1;
EGB_getBlock(gwork,para);
}
if( (ret=save_tiff(outfile,awork))!=0 )
{printf("ファイル %s への書き込みができませんでした。\n",outfile);
return ret;}
return 0;
}
int flat(int level)
{
_far unsigned short *vram1;
int i,j;
#define COLSP(x,g,r,b) { b=x & 0x001f; r=(x & 0x03e0)>>5; g=x>>10;}
#define COLCN(x,g,r,b) { x = b | (r<<5) | (g<<10); }
#define COLDF(g1,r1,b1,g2,r2,b2) ( _abs((g2)-(g1))+_abs((r2)-(r1))+_abs((b2)-(b1)))
_FP_SEG( vram1 ) = 0x104; /* 又は 0x10c */
_FP_OFF( vram1 ) = 256*1024;
for( j=1; j<239; j++)
for(i=1; i<319; i++)
{
int k,n,av,ag,ar,ab, g[9],r[9],b[9];
av=awork[j][i]; COLSP( av, ag, ar, ab);
av=awork[j-1][i-1]; COLSP( av, g[0], r[0], b[0]);
av=awork[j-1][i ]; COLSP( av, g[1], r[1], b[1]);
av=awork[j-1][i+1]; COLSP( av, g[2], r[2], b[2]);
av=awork[j ][i-1]; COLSP( av, g[3], r[3], b[3]);
av=awork[j ][i ]; COLSP( av, g[8], r[8], b[8]);
av=awork[j ][i+1]; COLSP( av, g[4], r[4], b[4]);
av=awork[j+1][i-1]; COLSP( av, g[5], r[5], b[5]);
av=awork[j+1][i ]; COLSP( av, g[6], r[6], b[6]);
av=awork[j+1][i+1]; COLSP( av, g[7], r[7], b[7]);
for(n=1,k=0;k<8;k++)
{
if( COLDF( g[8],r[8],b[8],g[k],r[k],b[k] ) <= level )
{ag+=g[k];ar+=r[k];ab+=b[k];n++;}
}
ag/=n;ar/=n;ab/=n;
COLCN( av, ag, ar, ab);
/* awork[j][i]=vram1[j*512+i]=av ; */
vram1[j*512+i]=av ;
}
return 0;
}
int set_screen()
{
EGB_init(gwork,EgbWorkSize); /* 画面初期化 */
EGB_resolution(gwork,0,3); /* page=0;mode */
EGB_writePage(gwork,0);
EGB_displayStart(gwork,0,0,0); /* 表示開始位置 (0,0) */
EGB_displayStart(gwork,1,0,0); /* 仮想画面の表示位置 */
EGB_displayStart(gwork,2,1,1); /* 拡大 */
EGB_displayStart(gwork,3,640,480); /* 画面のサイズ */
EGB_resolution(gwork,1,10); /* page=1;mode */
EGB_writePage(gwork,1);
EGB_displayStart(gwork,0,0,0); /* 表示開始位置 (0,0) */
EGB_displayStart(gwork,1,0,0); /* 仮想画面の表示位置 */
EGB_displayStart(gwork,2,2,2); /* 拡大 */
EGB_displayStart(gwork,3,320,240); /* 画面のサイズ */
EGB_displayPage(gwork,0,3); /* page0 前 page1,2表示 */
return 0;
}
int load_tiff( const char *fname, char *awork)
{
int ret;
t.fname=(char *)fname;
if( (ret=tiff_getattr(&t) )!=0 ) return ret;
if( (ret=tiff_getimg( &t, (char *)awork))!=0 ) return ret;
if( t.bpixel!=16 ) return -3;
if( t.xsize >320 ) return -3;
if( t.ysize >240 ) return -3;
return 0;
}
/**/
PROTO int tiff_getattr( tiff_tag *t )
/*
* fname = ファイルネーム(拡張子も付ける)
* xsize = 横のドット数
* ysize = 縦のドット数
* bpixel= ピクセルのドット数 1:2 4:16 8:256 16:32768 色を示す。
* comprs= 圧縮の状態 1:無 5:LZW
* phintp= 0:モノクロ 1:カラー 3:パレット
* imgoff= 画像データへのoffset
* pltoff= パレットデータへのoffset 0:パレット未使用
* ibyte = 画像データのバイト数
*/
{
FILE *fp;
int i;
if((fp=fopen(t->fname, "rb"))==NULL) return -1;
if(fread( fwork, 1,0x200,fp) != 0x200) {fclose(fp); return -1;}
t->xsize= t->ysize= t->bpixel= t->comprs= t->imgoff= t->pltoff= t->ibyte=0;
if(fclose(fp)) return -1;
if( strncmp( (const char*)fwork,"\x49\x49\x2a\x00\x08\x00\x00\x00",8)!=0)
return -2;
for(i=0; i< WORD(fwork+8); i++)
switch(WORD(fwork+0xa+i*12))
{
case 0x0100: t->xsize =(short) DWORD(fwork+0x12+i*12); break;
case 0x0101: t->ysize =(short) DWORD(fwork+0x12+i*12); break;
case 0x0102: t->bpixel=(short) DWORD(fwork+0x12+i*12); break;
case 0x0103: t->comprs=(char) DWORD(fwork+0x12+i*12); break;
case 0x0106: t->phintp=(char) DWORD(fwork+0x12+i*12); break;
case 0x0111: t->imgoff=(short) DWORD(fwork+0x12+i*12); break;
case 0x0117: t->ibyte =(long) DWORD(fwork+0x12+i*12); break;
case 0x0140: t->pltoff=(short) DWORD(fwork+0x12+i*12); break;
};
if( (t->bpixel != 16) || (t->phintp != 1) ) return -3;
if( (t->comprs != 1) && (t->comprs != 5) ) return -3;
return 0;
}
/**/
PROTO int tiff_getimg( tiff_tag *t, char *ibuf)
{
FILE *fp;
int datasz;
if((fp=fopen(t->fname, "rb"))==NULL) return -1;
if(fseek(fp,t->imgoff,SEEK_SET)) {fclose(fp); return -1;}
datasz=fread( ibuf, 1, 240*320*2,fp);
if(fclose(fp)) return -1;
if( t->comprs == 5)
{ char *mv;
t->comprs = 1;
mv=ibuf+(320*240*2-datasz);
_rmemcpy(mv,ibuf,datasz);
tiff_uncmp2( ibuf, (const char *)mv, datasz);
}
t->ibyte = t->xsize * t->ysize*2;
return 0;
}
/**/
PROTO int save_tiff(const char *savefile, char *awork)
{
FILE *fp;
int i;
for(i=0; i< WORD(fwork+8); i++)
switch(WORD(fwork+0xa+i*12))
{
case 0x0103: DWORD(fwork+0x12+i*12)=1 ; break;
case 0x0117: DWORD(fwork+0x12+i*12)=t.xsize*t.ysize*2 ; break;
};
if((fp=fopen(savefile, "wb"))==NULL) return -1;
if(fwrite( fwork,1, 0x200,fp) != 0x200 ) {fclose(fp);return -1;}
if(fwrite( awork,1, t.ibyte,fp) != t.ibyte ) {fclose(fp);return -1;}
if(fclose(fp)) return -1;
return 0;
}
/**/
/* LZW 圧縮されたデータを展開する */
/* 1992-2 OH! FM TOWNS p.75 を参考にした */
/* expand :展開する領域の先頭アドレス */
/* indata :圧縮されたデータ */
/* 戻り値 :展開したバイト数 エラーのときは 0 */
/* 使用メモリー : stack 33K bytes */
PROTO int tiff_uncmp2( char *expand, const char *indata, int insize)
{
struct { char *s,*e; } table[MAXTABLE];
char chrd[256];
char *outdata;
int cbl,btp,table_ix;
unsigned int code;
int i;
btp=0; outdata= expand;
for(i=0;i<256;i++) {chrd[i]=i;table[i].s=table[i].e=&chrd[i];}
table_ix=EOF_CODE+1;
cbl=9;i=0;
while( i++ < insize ) {
/* ret = ((indata[0]*256+indata[1])*256+indata[2])*256 ; */
code = ((((indata[0]<<8) | indata[1])<<8) | indata[2])<<8 ;
code = code << btp ;
code = code >> (32-cbl) ;
btp=cbl-(8-btp); indata++;
while( btp >= 8 ) {indata++; btp-=8;}
if( code == EOF_CODE ) {
break;
} else if( code == CLEAR_CODE ) { /* クリアコード */
table_ix=EOF_CODE+1;
cbl=9;
} else if( code < table_ix ) { /* テーブルに存在 */
register char *p;
table[table_ix].s=outdata;
for( p=table[code].s; p<=table[code].e; *outdata++=*p++);
table[table_ix++].e=outdata;
if(table_ix==(1<<cbl)) {cbl++; if(cbl>=13) cbl=12;}
} else {
return 0;
}
}
return (int) (outdata-expand);
}